W niniejszym projekcie będziemy dokonywać klasteryzacji zbioru reigijnych ksiąg azjatyckich oraz biblijnych. Zagadnienie to wymaga więcej kreatywności niż zagadnienia regresji i klasyfikacji.
W tej cześci projektu, czyli Exploratory Data Analysis, postaramy się jak najbliżej przyjrzeć się zbiorowi danych i możliwości jakie ze sobą niesie.
Najpierw załadujmy zbiór danych:
books <- readRDS("./books.RDS")
Spójrzmy na parę pierwszych obserwacji:
head(books)
W pierwszej kolumnie znajdują się odpowiednie rozdziały z danej księgi - w tym przypadku z księgi Buddyzmu. W kolejnych kolumnach jest liczba wystąpień danego słowa w obserwacji będącej chapterem(rozdziałem) rozważanej księgi.
Sprawdzimy czy w zbiorze danych są jakieś braki (chociaż wątpię):
sum(is.na(books))
## [1] 0
Zatem w danych nie ma braków ni stąd ni zowąd - zbiory danych są dobrze zdefiniowane.
Sprawdźmy ile mamy ksiąg, a w nich rozdziałów.
Posortowaliśmy liczbę rozdziałów w każdej księdze i wstawiliśmy do tabelki:
chapters <- books %>% group_by(X) %>%
summarize(count = n()) %>%
arrange(desc(count))
chapters
Widzimy, że indyjskie i japońskie księgi mają znacznie więcej rozdziałów/obserwacji niż księgi biblijne np. Księga Madrości(Book of Wisdom) lub Księga Koheleta(Books of Exxlesiastes).
Sprawdzimy teraz rozmiar naszego zbioru danych:
dim(books)
## [1] 590 8267
Mamy 8 ksiąg, 590 rozdziałów, a liczba unikalnych słówek(kolumn) to 8266, ponieważ nie liczymy pierwszej kolumny.
Poniżej przedstawiamy liczbę rozdziałów (obserwacji) dla każdej księgi tak jak występują one z wbiorze danych:
Sprawdzimy czy obserwacje różnią się objętościowo, czyli mają różną liczbę słów:
aux <- as.matrix(books[,2:ncol(books)])
# sumuje słowa w każdym rozdziale:
liczba_slow <- apply(aux, 1, sum)
boxplot(liczba_slow, main = "Liczba slow w danym rozdziale",
xlab = "liczba slow", horizontal = TRUE)
Widać, że przeważają księgi, których rozdziały mają do 100 słów. Uwidacznia się również inna grupa - tych rozdziałów, które 200-400 słów. Być może będzie to cenna wskazówka w przyszłości.
Niestety klasteryzacja na tak wysoce wymiarowym zbiorze danych nie jest dobrym pomysłem - musimy w pewien sposób zagregować nasze dane i zmniejszyć ich wymiar, aby móc w 2. kamieniu milowym rozpocząć wstępne modelowanie.
Oczywiście istnieją banalne sposoby agregacji typu zliczanie ilości słów w rozdziałach ksiąg, albo obliczanie średniej długości słowa. Jednakże, chcielibyśmy poszukać tych mniej oczywistych przekształceń. Rozważymy:
Tutaj tylko ładujemy przekształcone zbiory danych. Kod pomocny w celu wygenerowania ich jest w pliku eda2.R.
W internecie łatwo znaleźć odpowiednie zbiory danych dotyczących słówek i odpowiadających im części mowy w języku angielskim. Odpowiednio zagregowaliśmy dane i otrzymaliśmy następujący rezultat:
books2 <- readRDS("./speech_parts_aggregated.RDS")
head(books2, 10)
tail(books2, 10)
Na pierwszy rzut oka, w Buddhism nie ma za wiele przysłówków (adverb), a w Book Of Wisdom jest ich procentowo więcej.
Można również dostrzec, że w BookOfWisdom jest więcej słówek jako takich - te rozdziały są ‘większe objętościowo’. Postaramy się wziąć to pod uwagę w następnym kamieniu milowym, a samo zliczanie słówek jest łatwe w porównaniu do zastosowanych w tym projekcie przekształceń danych.
Sprawdzimy wariancję poszczególnych zmiennych i zwizualizujemy te 3 wymiary o największej wariancji.
var(books2$noun)
## [1] 5377.19
var(books2$verb)
## [1] 423.6466
var(books2$adjective)
## [1] 147.7935
var(books2$adverb)
## [1] 34.43071
Weźmemy zatem 3 pierwsze kolumny, czyli noun, verb i adjective.
Przedstawimy je na wykresie 3D i zobaczymy czy obserwacje z tego samego klastra różnią się co do liczby części mowy.
data0 <- books2 %>% select(X, noun, verb, adjective)
data <- data0 %>% mutate(noun = log10(noun), verb = log10(verb), adjective = log10(verb))
data$X <- as.factor(as.integer(as.factor(data$X)))
plot_ly(x=data$noun, y=data$verb, z=data$adjective, type="scatter3d", mode="markers", color=data$X)
Legenda:
Powyższy wykres w zasadzie nic nadzwyczajnego nie pokazuje. Pierwsze 4 kolory reprezentują księgi azjatyckie, które mają więcej słów w rozdziałach. Natomiast kolejne 4 kolory to księgi bilbijne. Obserwacje prawdopodobnie można podzielić na wykresie na 2 klastry np. metodą kmeans. Informacja ta mogła być już wykorzystana na poziomie zliczania liczby słów w księgach.
Zamienimy liczbę części mowy na ich procentowy udział w rozdziałach w ostatecznym modelowaniu.
W internecie znaleźliśmy zbiór słówek wraz z przyporządkowanym im emocjom. Niestety, zaledwie 10% słówek w naszych księgach miało zdefiniowane emocje - trudno się dziwić, w tych księgach są archaiczne słowa zazwyczaj nie analizowane w dzisiejszych czasach. Miejsmy nadzieję, że te 10% będzie reprezentatywne.
Odpowiednio zagregowaliśmy dane i otrzymaliśmy następujący rezultat:
emotions <- readRDS("./emotions.RDS")
head(emotions, 20)
tail(emotions, 20)
Możemy zauważyć, że Księdze Buddyzmu emocje są wymieszane, natomiast w Księdze Mądrości dominuje emocja “happy”, ale również “fear”. W Księdze Mądrości pojawia się również ‘disgust’, której to emocji brakuje w Księdze Buddyzmu.
Sprawdzimy wariancję poszczególnych zmiennych i zwizualizujemy te 3 wymiary o największej wariancji.
var(emotions$surprise)
## [1] 4.649193
var(emotions$sad)
## [1] 6.552502
var(emotions$neutral)
## [1] 4.991019
var(emotions$happy)
## [1] 41.43495
var(emotions$anger)
## [1] 7.200645
var(emotions$fear)
## [1] 16.53104
var(emotions$disgust)
## [1] 0.2121637
Do przykładowego wykresu 3D wybieramy emocje: happy, anger oraz fear
data0 <- emotions %>% select(X, happy, anger, fear)
data <- data0 %>% mutate(happy = log10(happy), anger = log10(anger), fear = log10(fear))
data$X <- as.factor(as.integer(as.factor(data$X)))
plot_ly(x=data$happy, y=data$anger, z=data$fear, type="scatter3d", mode="markers", color=data$X)
Legenda:
Tutaj również widzimy, że księgi 1-4 mają więcej emocji happy. Kilka rozdziałów z księga 5, czyli Book of Proverb ma bardzo dużo emocji anger jak na swoją objętość. Jeśli chodzi o emocje to tutaj ciężej jest rozgraniczyć obserwacje na te większe objętościowo i mniejsze. Z tego powodu mamy nadzieję, że w ostatecznym modelowaniu, po zamianie liczby emocji na ich udział procentowy, uda nam się dokonać lepszej klasteryzacji.
W agregacji wzlędem emocji mamy 7 kolumn - na pierwszy rzut można było dostrzec różnice między Księgą Buddyzmu a Księgą Mądrości - być może dzieki takiemu przekształceniu danych będziemy mogli dokonać klasteryzacji.
W agregacji dotyczącej cześci mowy zamiast 8266 kolumn zostały nam tylko 4 - idealnie! :)
Po sprawdzeniu że w zbiorze jest różnorodność jeśli chodzi o liczbę słów w danym rozdziale księgi, nie wykonywaliśmy wykresów np. 3D, na które przyjdzie czas w następnym kamieniu milowym. Jeden krok do klasteryzacji może polegać na podziale ksiąg na małe i duże objętościowo jednakże ważne jest aby nie korzystać z tego faktu przy używaniu przekształconego zbioru danych dla emocji i części mowy - oczywistym jest fakt, że przedstawiając typowy wykres 3D, księgi większe zazwyczaj będą miały więcej słów o danych emocjach, zatem będa bardziej oddalone od początku układu współrzędnych. Taki wykres dawałby złudną nadzieję, że te większe księgi są bardziej nacechowane emocjonalnie.
W następnym kamieniu milowym dotyczącym inżynierii cech i wstępnego modelowania postaramy się odpowiednio przeskalować księgi, aby emocje i cześci mowy były zdefiniowane np. na 50 albo 100 słów.
Oczywiście nic nie stoi na przeszkodzie, aby połączyć nasze 2 bardziej zaawansowane przekształcenia; przy klasteryzacji patrzeć zarówno na części mowy jak i emocje wzbudzające odpowiednie słowa zawarte w tekstach ksiąg. Możliwe, że efekt będzie pozytywny.
Potwierdzam samodzielność powyższej pracy oraz niekorzystanie przeze mnie z niedozwolonych źródeł.